"""
单任务： 单任务的应用程序  cmd.exe 没办法同时间执行多条命令
多任务： 多任务的应用  windows操作系统，迅雷  （同时下载多个文件，边播变下载）
多任务的实现方式：多进程、多线程、协程
串行运行：在linux中串行多条命令用& ，apt install python & apt install mysql
并行运行：在linux中并行多条命令用&& ，apt install python && apt install mysql
并发：迅雷下载同时下载5个电影（单核cpu）  ---并发
并行：3太电脑分别安装一个mysql8.0，然后组成mysql集群，3个mysql是同时运行（并行）
    5个收营员 同时操作5台  收款机  ---并行



进程：静态的（软件、程序、代码、函数）    动态的（软件运行、程序运行、代码运行、函数运行）
进程是动态的。  程序是怎么运行的？ 操作系统创建一个进程，加载代码到内存，为变量分配内存，建个档案，process ID PID
"""

from multiprocessing import Process, Queue
import os

import requests

"""
需求：使用多进程实现并发下载图片
多进程会独占资源，两个进程不能共享变量（例如：不能共享list，如何实现共享资源呢？（队列queue，内存数据库redis））
多线程占用资源少，2个线程共享变量，迅雷就是使用多线程技术的
"""


def init_task():
    tasks = Queue()
    tasks.put(
        "https://img.bosszhipin.com/beijin/upload/avatar/20221203/607f1f3d68754fd0029e2eb2c80cc5a7705394a1e9d796553335bff3b7ad4bd5497ffee8771cb79e_s.png")
    tasks.put(
        "https://img.bosszhipin.com/beijin/mcs/banner/f074178f63c9b52aec4d08baaace477ccfcd208495d565ef66e7dff9f98764da.jpg?x-oss-process=image/resize,w_100,limit_0")


def download(q: Queue):
    while True:
        url = q.get()
        r = requests.get(url)  # 想浏览器一样发起请求
        img_name = url.split('/')[-1]

        with open(img_name, 'wb') as f:
            f.write(r.content)  # 把服务器返回的信息（图片）
            print('下载完成')
        if q.empty():
            break


if __name__ == '__main__':
    print()
    tasks = Queue()
    # put 相当于list中的append方法
    tasks.put(
        "https://img.bosszhipin.com/beijin/upload/avatar/20221203/607f1f3d68754fd0029e2eb2c80cc5a7705394a1e9d796553335bff3b7ad4bd5497ffee8771cb79e_s.png")
    tasks.put(
        "https://static.zhipin.com/v2/web/geek/images/logo.png")

    p1 = Process(target=download, args=(tasks,))  # 创建一个执行downlo函数的进程
    p2 = Process(target=download, args=(tasks,))
    p1.start()  # 启动进程
    p2.start()
    # 进程启动后，是由操作系统控制执行的
